package com.chenwc.util.translate.youdao;

import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.chenwc.util.httputil.httpurlconnection.RestMock;
import com.chenwc.util.translate.youdao.constant.YouDaoConstant;
import com.chenwc.util.translate.youdao.enumeration.YouDaoDomain;
import com.chenwc.util.translate.youdao.enumeration.ErrorCode;
import com.chenwc.util.translate.youdao.enumeration.YouDaoLang;
import com.chenwc.util.translate.youdao.util.YoudaoAuthUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * 翻译工具类
 *
 * @author chenwc
 * @package com.chenwc.util.translate.youdao
 * @project wso2-sinicization
 * @date 2024/5/25
 */
public class TranslateByYouDaoUtil {
    private static final Logger log = LoggerFactory.getLogger(TranslateByYouDaoUtil.class);

    /**
     * 中译英
     *
     * @param q 待翻译的文本
     * @return 翻译后的文本
     */
    public static String ch2en(String q) {
        return convertMessage(RestMock.sendPost(YouDaoConstant.API_HTTPS_ADDR, new HashMap<>(),
                getformBodyMap(q, YouDaoLang.CHINESE, YouDaoLang.ENGLISH, YouDaoDomain.GENERAL)), q);
    }

    /**
     * 中译英
     *
     * @param q      待翻译的文本
     * @param youDaoDomain 领域化翻译
     * @return 翻译后的文本
     */
    public static String ch2en(String q, YouDaoDomain youDaoDomain) {
        return convertMessage(RestMock.sendPost(YouDaoConstant.API_HTTPS_ADDR, new HashMap<>(),
                getformBodyMap(q, YouDaoLang.CHINESE, YouDaoLang.ENGLISH, youDaoDomain)), q);
    }

    /**
     * 英译中
     *
     * @param q 待翻译的文本
     * @return 翻译后的文本
     */
    public static String en2ch(String q) {
        return convertMessage(RestMock.sendPost(YouDaoConstant.API_HTTPS_ADDR, new HashMap<>(),
                getformBodyMap(q, YouDaoLang.ENGLISH, YouDaoLang.CHINESE, YouDaoDomain.GENERAL)), q);
    }

    /**
     * 其他语种自动译中
     *
     * @param q 待翻译的文本
     * @return 翻译后的文本
     */
    public static String auto2ch(String q) {
        return convertMessage(RestMock.sendPost(YouDaoConstant.API_HTTPS_ADDR, new HashMap<>(),
                getformBodyMap(q, YouDaoLang.AUTO, YouDaoLang.CHINESE, YouDaoDomain.GENERAL)), q);
    }

    /**
     * 自定义翻译
     *
     * @param q    待翻译的文本
     * @param from 源语言
     * @param to   目标语言
     * @return 翻译后的文本
     */
    public static String translate(String q, YouDaoLang from, YouDaoLang to) {
        return convertMessage(RestMock.sendPost(YouDaoConstant.API_HTTPS_ADDR, new HashMap<>(),
                getformBodyMap(q, from, to, YouDaoDomain.GENERAL)), q);
    }

    /**
     * 自定义翻译+领域化翻译
     *
     * @param q      待翻译的文本
     * @param from   源语言
     * @param to     目标语言
     * @param youDaoDomain 领域化翻译
     * @return 翻译后的文本
     */
    public static String translate(String q, YouDaoLang from, YouDaoLang to, YouDaoDomain youDaoDomain) {
        return convertMessage(RestMock.sendPost(YouDaoConstant.API_HTTPS_ADDR, new HashMap<>(),
                getformBodyMap(q, from, to, youDaoDomain)), q);
    }

    /**
     * 生成表单map
     *
     * @param q      待翻译的文本
     * @param from   源语言
     * @param to     目标语言
     * @param youDaoDomain 领域化翻译
     * @return 表单map
     */
    private static String getformBodyMap(String q, YouDaoLang from, YouDaoLang to, YouDaoDomain youDaoDomain) {
        Map<String, String> formBodyMap = new HashMap<>();
        String curtime = YoudaoAuthUtil.getCurtime();
        String salt = UUID.randomUUID().toString();
        // sha256(应用ID+input+salt+curtime+应用密钥)
        formBodyMap.put("sign", YoudaoAuthUtil.getSignString(q, curtime, salt));
        // 待翻译文本，必须是UTF-8编码
        formBodyMap.put("q", q);
        // 当前UTC时间戳(秒)
        formBodyMap.put("curtime", curtime);
        // uuid，唯一通用识别码
        formBodyMap.put("salt", salt);
        // 签名类型
        formBodyMap.put("signType", "v3");
        // 源语言， 可设置为auto
        formBodyMap.put("from", from.getValue());
        // 目标语言
        formBodyMap.put("to", to.getValue());
        // 应用ID
        formBodyMap.put("appKey", YouDaoConstant.APP_ID);
        // 翻译结果音频格式，支持mp3
        //formBodyMap.put("ext", "mp3");
        // 翻译结果发音选择。0为女声，1为男声。默认为女声
        //formBodyMap.put("voice", "0");
        // 拒绝领域化翻译降级-当领域化翻译失败时改为通用翻译。true或false，默认为：false。仅在控制台开通领域化翻译的情况生效。
        formBodyMap.put("rejectFallback", "true");
        // 是否严格按照指定from和to进行翻译：true/false
        formBodyMap.put("strict", "true");
        // 领域化翻译，默认为：general。仅在控制台开通领域化翻译的情况下可传
        formBodyMap.put("domain", youDaoDomain.getDomain());
        return RestMock.generateGetParameter(formBodyMap);
    }

    /**
     * 解析有道智云翻译返回的报文。翻译失败会返回源语言
     *
     * @param resultString 有道智云翻译返回的报文
     * @param q            源语言
     * @return 翻译结果（默认取第一条翻译结果）
     */
    public static String convertMessage(String resultString, String q) {
        String translationStr = "";
        JSONObject retJsonObject = JSONObject.parseObject(resultString);
        log.info("有道智云翻译返回的报文: {}", retJsonObject.toJSONString());
        int errorCode = retJsonObject.containsKey("errorCode") ? retJsonObject.getIntValue("errorCode") : ErrorCode.C_17005.getCode();
        log.info("翻译结果: {}", ErrorCode.getErrorCodeMessage(errorCode));
        if (0 == errorCode) {
            log.info("*************************************************************************************************");
            log.info("源语言和目标语言: {}", retJsonObject.containsKey("l") ? retJsonObject.getString("l") : "");
            log.info("*************************************************************************************************");
            log.info("翻译结果是否为领域翻译: {}",
                    retJsonObject.containsKey("isDomainSupport") ? retJsonObject.getString("isDomainSupport") : "false");
            log.info("*************************************************************************************************");
            log.info("翻译结果是否为单词: {}",
                    retJsonObject.containsKey("isWord") ? retJsonObject.getString("isWord") : "false");
            log.info("*************************************************************************************************");
            log.info("源语言: {}", retJsonObject.containsKey("query") ? retJsonObject.getString("query") : "");

            log.info("*************************************************************************************************");
            JSONArray translation = retJsonObject.containsKey("translation") ? retJsonObject.getJSONArray("translation")
                    : new JSONArray();
            if (!translation.isEmpty()) {
                for (int i = 0; i < translation.size(); i++) {
                    //只取第一条
                    if (i == 0) {
                        translationStr = translation.getString(i);
                    }
                    log.info("翻译结果 " + (i + 1) + ": {}", translation.getString(i));
                }
            } else {
                log.info("翻译结果: {}", "");
            }
//            JSONObject basic = retJsonObject.containsKey("basic") ? retJsonObject.getJSONObject("basic") : new JSONObject();
//            log.info("*************************************************************************************************");
//            if (null != basic && !basic.isEmpty()) {
//                log.info("---基本词典---");
//                log.info("音标/拼音: {}", basic.getString("phonetic"));
//                JSONArray explains = basic.containsKey("explains") ? basic.getJSONArray("explains") : new JSONArray();
//                List<String> explainsList = new ArrayList<>();
//                for (int i = 0; i < explains.size(); i++) {
//                    explainsList.add(explains.getString(i));
//                }
//                log.info("基本释义: {}", String.join(";", explainsList));
//            } else {
//                log.info("基本词典: {}", "");
//            }
//            log.info("*************************************************************************************************");
//            JSONArray web = retJsonObject.containsKey("web") ? retJsonObject.getJSONArray("web") : new JSONArray();
//            if (null != web && !web.isEmpty()) {
//                for (int i = 0; i < web.size(); i++) {
//                    JSONObject data = web.getJSONObject(i);
//                    JSONArray value = data.containsKey("value") ? data.getJSONArray("value") : new JSONArray();
//                    log.info("网络释义 " + (i + 1) + ": {}", data.getString("key"));
//                    List<String> valueList = new ArrayList<>();
//                    for (int k = 0; k < value.size(); k++) {
//                        valueList.add(value.getString(k));
//                    }
//                    log.info(String.join(" | ", valueList));
//                }
//            } else {
//                log.info("网络释义: {}", "");
//            }
//
//            log.info("*************************************************************************************************");
//            JSONObject dict = retJsonObject.containsKey("dict") ? retJsonObject.getJSONObject("dict") : new JSONObject();
//            log.info("词典deeplink: {}", dict.getString("url"));
//            log.info("*************************************************************************************************");
//            JSONObject webdict = retJsonObject.containsKey("webdict") ? retJsonObject.getJSONObject("webdict") : new JSONObject();
//            log.info("webdeeplink: {}", webdict.getString("url"));
//            log.info("*************************************************************************************************");
//            String tSpeakUrl = retJsonObject.containsKey("tSpeakUrl") ? retJsonObject.getString("tSpeakUrl") : "";
//            log.info("翻译结果发音地址: {}", tSpeakUrl);
//            //下载翻译结果发音文件
//            RestMock.downloadFileByGet(tSpeakUrl, YouDaoConstant.SAVE_FILE_PATH + "翻译结果发音_" + retJsonObject.getString("query").substring(0, 20) + ".mp3");
//            log.info("*************************************************************************************************");
//            String speakUrl = retJsonObject.containsKey("speakUrl") ? retJsonObject.getString("speakUrl") : "";
//            log.info("源语言发音地址: {}", speakUrl);
//            //下载源发音文件
//            RestMock.downloadFileByGet(speakUrl, YouDaoConstant.SAVE_FILE_PATH + "源语言发音_" + retJsonObject.getString("query").substring(0, 20) + ".mp3");
//            log.info("*************************************************************************************************");
//            JSONArray returnPhrase = retJsonObject.containsKey("returnPhrase") ? retJsonObject.getJSONArray("returnPhrase") : new JSONArray();
//            if (null != returnPhrase && !returnPhrase.isEmpty()) {
//                for (int i = 0; i < returnPhrase.size(); i++) {
//                    List<String> returnPhraseList = new ArrayList<>();
//                    for (int k = 0; k < returnPhrase.size(); k++) {
//                        returnPhraseList.add(returnPhrase.getString(k));
//                    }
//                    log.info("单词校验后的结果: {}",
//                            String.join(";", returnPhraseList));
//                }
//            } else {
//                log.info("单词校验后的结果: {}", "");
//            }
//            log.info("*************************************************************************************************");
        } else {
            translationStr = q;
        }
        return translationStr;
    }
}
